<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateActivitisTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */

    public function up()
    {
        //志愿活动表：下面可以关联以下几个子表
        //         志愿活动参与人表：同user表建立关联
        //         志愿活动直播表，直播是一种类似朋友圈的九宫格展示图，按时间轴逆时针排列
        //         志愿活动组织单位表，同user_groups关联，每个活动发起组织可以是一个组织，也可以是多个组织联合发起
        //         活动开展城市表，同cities表关联，一个活动可以只在一个城市举行，也可以同时在多个城市举行，但是至少要指定一个城市
        //              (用户在小程序端完成注册以及志愿者身份认证后，可以加入对应的城市的活动，
        //               如果该活动只在一个城市举行，那么用户直接加入就可以了，
        //               如果该活动同时在多个城市举行，那么用户在加入时需要弹出界面让用户选择报名参加哪个城市的活动，默认的是该志愿者自己所在城市的活动)
        Schema::create('activities', function (Blueprint $table) {
            $table->increments('id')->unsigned();
            $table->string('code', 200)->nullable()->comment('活动编号');
            $table->string('subject', 200)->nullable()->comment('活动名称');
            //报名起始以及结束时间会影响到活动的状态，志愿者只有在报名时间段内才可以报名
            //后台通过linux的crontab配合laravel本身的任务机制，每一分钟执行一次job进行状态清洗，
            //发现系统时间已经到了可报名时间，需要将状态变为报名中
            $table->dateTime('enter_time_start')->nullable()->comment('报名起始时间，精确到分钟，秒数全部为0');
            $table->dateTime('enter_time_end')->nullable()->comment('报名结束时间，精确到分钟，秒数全部为0');
            //后台通过linux的crontab配合laravel本身的任务机制，每一分钟执行一次job进行状态清洗
            //发现系统时间已经到了开始时间，则需要将状态变为已开始
            //发现系统时间已经超过了活动结束时间，则需要将状态变为已结束
            $table->dateTime('active_time_start')->nullable()->comment('活动起始时间，精确到分钟，秒数全部为0');
            $table->dateTime('active_time_end')->nullable()->comment('活动结束时间，精确到分钟，秒数全部为0');
            //暂时就是这几个枚举分类，创建任务时由用户自行选择活动类型，如果后期有新的分类，则直接改系统里的数据字典
            $table->tinyInteger('activity_type')->default(0)->nullable()->comment('活动类型：1=社区任务，2=老人任务，3=团队任务，4=党建活动');
            $table->integer('volunteer_num')->default(0)->nullable()->comment('需求人数，0表示人数不限制');
            //志愿者参与方式：
            //1、不限制开放参与：如果不限制，那么所有人都可以参与该活动，
            //2、如果限定团队组织成员参与，那么只有发起的组织成员的用户方可参与
            //注意：发起组织可以只是一个单位（group），也可能是多个单位联合组织，因此一个活动与发起组织是1对多的关系
            //发起组织内部会根据内部分组（利用user_role来对组织内部人员进行分组，由于user_role是可以很灵活的让每个group的管理员自己创建
            //因此管理员可以设置一些用户角色来专门应对一些具体活动，只有具体角色里的用户才可以允许参加该活动）
            $table->tinyInteger('join_method')->default(0)->unsigned()->nullable()->comment('志愿者参与方式：1=开放参与，2=限定团队组织成员参与');
            $table->string('volunteer_rule', 200)->nullable()->comment('志愿者参与要求：文本，活动发起人手工输入，比如要求志愿者年龄范围啊，性别要求啊，有没有志愿者证这些');
            $table->string('description', 8000)->nullable()->comment('活动详情：富文本');
            //最低需求人数限定了一个活动最少需要多少人才可以举办，管理员可以根据实际的报名参与人数动态调整该值
            $table->integer('min_volunteer_num')->default(1)->nullable()->comment('最低需求人数，必须大于0，默认为1');
            //已参加活动的人数
            $table->integer('join_num')->default(0)->nullable()->comment('已参加活动的人数');
            //审核状态：
            //理论上后期会有活动发布规则，因为按照民政部要求，不是任何团队都可以随便组织志愿者活动的，比如哪种志愿团体需要具备什么资质才可以举办什么类型的活动
            //然后发起单位发起了活动之后，系统自动根据规则将活动申请路由到具体主管部门审批
            //但是第一阶段开放的可以自主发布活动的单位比较少，而且都是限定的有资质的单位，因此第一阶段开发时自动就将状态变为已通过状态
            //第二阶段将会引入规则和工作审批流，活动默认是待审核状态，之后主管单位审批通过之后才可以生效
            //第二阶段时逻辑处理规则：待审核的和未通过状态的活动可以再次申请审核，审核单位进行审核时如果不允许通过则需要填写未通过理由
            //后期所有涉及到工作流程的均需要对操作记录操作日志
            //只有活动状态status为 1（未开始）或者 2（报名中）的活动才可以被取消，取消后audit_status=0
            $table->tinyInteger('audit_status')->unsigned()->nullable()->comment('审核状态：1=已取消，2=待提交，3=待审核, 4=已通过，5=未通过');
            $table->tinyInteger('status')->unsigned()->nullable()->comment('活动状态：1=未开始，2=报名中，3=已开始，4=已结束');
            //公益时长记录是比较权威的个人公益服务数据，理论上公益时长认定不可以开放给民间的志愿社团
            //第一阶段迭代先放开让社团活动管理员自行设定，后面需要收回权限由系统自动根据规则判定或者交由主管部门认定
            $table->decimal('time_length', 10, 2)->nullable()->comment('活动可获公益时长，为0则不计入公益时长');
            //存储图片只需要存储一个主图片，后面做接口时有时会用到活动的缩略图，需要对进口进行处理
            $table->string('picture', 200)->nullable()->comment('活动图片');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('activities');
    }
}
